/*-*
 * FILENAME  :
 *    $HeadURL$
 *
 * STATUS  :
 *    $Revision$
 *
 *    $Author$
 *    $Date$
 *  
 *    
 * Copyright (c) 2011 Gonalge Ltda. All rights reserved.
 *
 ****************************************************************/

package org.gonalge.arbolrojonegro.negocio;

import java.util.Random;

import org.gonalge.arbolrojonegro.dto.Nodo;

/**
 * 
 * @author Geremias Gonzalez
 */
public class ArchivoEvaluacion {

    private Lista preguntas = new Lista();

    private Lista respAc = new Lista();

    private Lista respEn = new Lista();

    private final ArbolRojoNegro arbol = new ArbolRojoNegro();

    private int ele = 0;

    private byte preguntaSel[] = new byte[10];

    private int nota;

    public void cargarArbol() {
        int n = new Random().nextInt(5) + 3;
        preguntas = new Lista();
        respAc = new Lista();
        respEn = new Lista();
        for (int i = 0; i < 10; i++) {
            respEn.insertar(respEn.getSize(), "");
        }

        preguntaSel = new byte[10];
        int i = 0;
        arbol.setRaiz(null);
        while (i < n) {
            ele = new Random().nextInt(50) + 1;
            if (!arbol.existe(ele)) {
                arbol.insertar(ele);
                arbol.actualizar(arbol.getRaiz());
                i++;
            }
        }
    }

    public void preguntas() {
        preguntas.insertar(preguntas.getSize(), "La Raiz del arbol puede ser de color Rojo");
        respAc.insertar(respAc.getSize(), false);

        preguntas.insertar(preguntas.getSize(), "En la insersion, la Forma 1 se puede aplicar mas de una vez");
        respAc.insertar(respAc.getSize(), false);

        preguntas.insertar(preguntas.getSize(), "El recorrido Preorden nos muestra los elementos de forma Ascendente");
        respAc.insertar(respAc.getSize(), true);

        preguntas.insertar(preguntas.getSize(), "La altura de un Arbol es  igual a la Rama mas larga del Arbol  ");
        respAc.insertar(respAc.getSize(), true);

        int n = new Random().nextInt(arbol.Altura()) + 1;
        preguntas.insertar(preguntas.getSize(), "¿El numero " + ele + " esta en el nivel " + n + "?");
        respAc.insertar(respAc.getSize(), (arbol.nivel(ele) == n));

        preguntas.insertar(preguntas.getSize(), "El Arbol rojo y negro nunca esta balanceado");
        respAc.insertar(respAc.getSize(), false);

        preguntas.insertar(preguntas.getSize(), "En el arbol se tiene un problema llamado doble Negro");
        respAc.insertar(respAc.getSize(), false);

        preguntas.insertar(preguntas.getSize(), "En el peso del arbol se cuenta los nodos internos");
        respAc.insertar(respAc.getSize(), true);

        preguntas.insertar(preguntas.getSize(), "El nuevo Nodo insertado siempre toma el Color Rojo");
        respAc.insertar(respAc.getSize(), true);

        preguntas.insertar(preguntas.getSize(), "En la insersion, la Forma 2 solo se aplica una vez");
        respAc.insertar(respAc.getSize(), false);

        preguntas.insertar(preguntas.getSize(), "¿Cual es la Alruta del Arbol?");
        respAc.insertar(respAc.getSize(), arbol.Altura());

        preguntas.insertar(preguntas.getSize(), "¿Cuantas hojas tiene el arbol?");
        respAc.insertar(respAc.getSize(), arbol.listaHojas().getSize());

        preguntas.insertar(preguntas.getSize(), "¿Cuale es su Peso del Arbol?");
        respAc.insertar(respAc.getSize(), arbol.peso());

        preguntas.insertar(preguntas.getSize(), "¿Cuantos Niveles tiene el Arbol?");
        respAc.insertar(respAc.getSize(), (arbol.Altura() - 1));

        preguntas.insertar(preguntas.getSize(), "¿Cual es el Ultimo elento de la lista Preorden?");
        Lista b = arbol.preOrden();
        Nodo no = (Nodo) b.consultar(b.getSize() - 1);
        respAc.insertar(respAc.getSize(), no.getEle());

        preguntas.insertar(preguntas.getSize(), "¿Cual es el Ultimo elento de la lista PosOrden?");
        Lista a = arbol.posOrden();
        no = (Nodo) a.consultar(a.getSize() - 1);
        respAc.insertar(respAc.getSize(), no.getEle());

        preguntas.insertar(preguntas.getSize(), "¿Cuantos Nodos externos tiene el arbol?");
        respAc.insertar(respAc.getSize(), arbol.nodosExternos());

        preguntas.insertar(preguntas.getSize(), "¿Cuantos Nodo rojos Existe?");
        respAc.insertar(respAc.getSize(), arbol.cantidadRojo());

        preguntas.insertar(preguntas.getSize(), "¿Cuantos Nodos son Padres?");
        respAc.insertar(respAc.getSize(), arbol.cantidadPadre());

        preguntas.insertar(preguntas.getSize(), "¿Cual es el mayor elemento?");
        respAc.insertar(respAc.getSize(), arbol.preOrden().consultar(arbol.preOrden().getSize() - 1));

    }

    public void cargarRespuestas(int i, Object respuesta) {
        respEn.insertar(i, respuesta);
    }

    public int nota() {
        return nota(9);
    }

    private int nota(int c) {
        if (c >= 0) {
            nota(c - 1);
            int e = preguntaSel[c] - 1;
            if (respAc.consultar(e).equals(respEn.consultar(c)))
                nota += 10;
        } else {
            nota = 0;
        }
        return nota;
    }

    private boolean existeParteBaja(int e) {
        boolean sw = false;
        for (int i = 0; i < 5; i++) {
            if (preguntaSel[i] == e) {
                return true;
            }
        }
        return sw;
    }

    private boolean existeParAlta(int e) {
        boolean sw = false;
        for (int i = 5; i < 10; i++) {
            if (preguntaSel[i] == e) {
                return true;

            }
        }
        return sw;
    }

    public void cargarPregunta() {
        int i = 0;
        while (i < 5) {
            int n = new Random().nextInt(10) + 1;
            if (!existeParteBaja(n)) {
                preguntaSel[i] = (byte) n;
                i++;
            }
        }
        while (i < 10) {
            int n = new Random().nextInt(10);
            n = n + 11;
            if (!existeParAlta(n)) {
                preguntaSel[i] = (byte) n;
                i++;
            }
        }
    }

    public String getPregunta(int i) {
        return (String) preguntas.consultar(preguntaSel[i] - 1);
    }

    public ArbolRojoNegro getArbol() {
        return arbol;
    }

}
